package com.dhweb.util;

import com.dhweb.entity.ExtractCallback;
import net.sf.sevenzipjbinding.IInArchive;
import net.sf.sevenzipjbinding.SevenZip;
import net.sf.sevenzipjbinding.impl.RandomAccessFileInStream;

import java.io.File;
import java.io.RandomAccessFile;
import java.util.HashSet;
import java.util.Set;

/**
 * 压缩文件工具类
 * @author zhouxl
 * @DATE 2021/8/24
 * @descriptoin
 */
public class CompressUtil {

    private static String ZIP_TYPE = "zip";

    private static String WAR_TYPE = "war";

    private static String RAR_TYPE = "rar";

    /**
     * 获取文件后缀名，并转化为大写
     * @param fileName
     * @return
     */
    public static String getFileSuffixToUpper(String fileName){
        return getFileSuffix(fileName).toUpperCase();
    }


    /**
     * 获取文件后缀名，并转化为小写
     * @param fileName
     * @return
     */
    public static String getFileSuffixToLower(String fileName){
        return getFileSuffix(fileName).toLowerCase();
    }

    /**
     * 获取文件后缀名
     * @param fileName
     * @return
     */
    public static String getFileSuffix(String fileName){
        int suffixIndex = fileName.lastIndexOf(".");
        if( suffixIndex == -1 ){
            return null;
        }
        String suffixType = fileName.substring(suffixIndex+1);
        if( suffixType == null ){
            return null;
        }
        return suffixType;
    }

    /**
     * 判断当前类型是否是压缩文件类型
     * @param fileType 文件类型
     * @return
     */
    public static boolean compressFileType(String fileType){
        if (fileType == null || "".equals(fileType.trim()) ){
            return false;
        }
        fileType = fileType.toLowerCase();
        if( ZIP_TYPE.equals(fileType) || WAR_TYPE.equals(fileType) || RAR_TYPE.equals(fileType) ){
            return true;
        }
        return false;
    }

    /**
     * 获取没有后缀的zip文件名称
     * @return 文件名
     */
    public static String getFileNameNoSuffix(File zipFile){
        if( zipFile == null || !zipFile.exists() ){
            return null;
        }
        String name = zipFile.getName();
        if( name == null || "".equals(name)){
            return null;
        }
        int index = name.lastIndexOf(".");
        if( index == -1 ){
            return null;
        }
        return name.substring(0,index);
    }


    /**
     *  校验zip下index.html文件合法性
     *  在index.html所在同级目录中，必须包含有
     *  index.html(f) + css(d) + js(d)
     * */
    public static boolean checkZipFileLegitimate(File[] files){
        Set<String> indexPageInitInfo = new HashSet<String>();
        indexPageInitInfo.add("index.html");
        indexPageInitInfo.add("css");
        indexPageInitInfo.add("js");
        for(File f:files){
            indexPageInitInfo.remove(f.getName());
        }
        return indexPageInitInfo.size() == 0;
    }

    /**
     * 解压rar文件
     * @param rarFilePath
     * @param outDir
     * @throws Exception
     */
    public static void unRar(String rarFilePath , String outDir ) throws Exception {
        IInArchive archive;
        RandomAccessFile randomAccessFile;
        // 第一个参数是需要解压的压缩包路径，第二个参数参考JdkAPI文档的RandomAccessFile
        //r代表以只读的方式打开文本，也就意味着不能用write来操作文件
        randomAccessFile = new RandomAccessFile(rarFilePath, "r");
        archive = SevenZip.openInArchive(null, // null - autodetect
                new RandomAccessFileInStream(randomAccessFile));
        int[] in = new int[archive.getNumberOfItems()];
        for (int i = 0; i < in.length; i++) {
            in[i] = i;
        }
        archive.extract(in, false, new ExtractCallback(archive,outDir));
        archive.close();
        randomAccessFile.close();
    }


}
